home *** CD-ROM | disk | FTP | other *** search
- #include <SetupA4.h>
-
- #include "ExternalInterface.h"
- #include "DialogUtilities.h"
-
- /*
- This external shows the use of some less trivial functionality.
-
- It puts up a dialog, and uses the text entered in the text field
- to prefix every line, optionally in the selection.
- */
-
- enum
- {
- sel_only = 3,
-
- insert,
- delete,
-
- beginning,
- end,
-
- prefix_str
- };
-
- static struct
- {
- Boolean insert;
- Boolean line_start;
- Boolean sel_only;
- Boolean pad;
-
- Str255 prefix_str;
- } prefix_info;
-
- static void maintain_buttons(DialogPtr d)
- {
- SetDlgCtl(d, insert, prefix_info.insert);
- SetDlgCtl(d, delete, ! prefix_info.insert);
-
- SetDlgCtl(d, beginning, prefix_info.line_start);
- SetDlgCtl(d, end, ! prefix_info.line_start);
-
- SetDlgCtl(d, sel_only, prefix_info.sel_only);
- }
-
- pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
- {
- DialogPtr d;
- GrafPtr save_port;
-
- short act_len;
-
- long sel_end, sel_start, first_char;
- long start_line, end_line;
- long old_start;
-
- short item;
-
- Handle text;
- char *s;
-
- RememberA0();
- SetUpA4();
-
- GetPort(&save_port);
-
- d = callbacks->CenterDialog(128);
- SetPort(d);
-
- callbacks->GetSelection(&sel_start, &sel_end, &first_char);
-
- callbacks->GetPreference('Prfx', sizeof(prefix_info), &prefix_info, &act_len);
- if (act_len <= 0)
- {
- prefix_info.insert = TRUE;
- prefix_info.line_start = TRUE;
- BlockMove("\p> ", prefix_info.prefix_str, 3);
- prefix_info.sel_only = sel_end != sel_start;
- }
-
- XAbleDlgCtl(d, sel_only, prefix_info.sel_only);
-
- SetStrItem(d, prefix_str, prefix_info.prefix_str);
-
- SelIText(d, prefix_str, 0, 255);
-
- do {
- maintain_buttons(d);
-
- ModalDialog(callbacks->StandardFilter, &item);
-
- switch (item)
- {
- case insert:
- case delete:
- prefix_info.insert = (item == insert);
- break;
-
- case beginning:
- case end:
- prefix_info.line_start = (item == beginning);
- break;
-
- case sel_only:
- prefix_info.sel_only = ! prefix_info.sel_only;
- break;
- }
- } while ((item != 1) && (item != 2));
-
- ReadStrItem(d, prefix_str, prefix_info.prefix_str);
-
- DisposDialog(d);
- SetPort(save_port);
-
- if (item == 1) {
- callbacks->SetPreference('Prfx', sizeof(prefix_info), &prefix_info, &act_len);
-
- start_line = 0;
- end_line = callbacks->GetLastLine();
-
- if (prefix_info.sel_only) {
- start_line = callbacks->GetLineNumber(sel_start);
- end_line = callbacks->GetLineNumber(sel_end);
- };
-
- s = (char *)&prefix_info.prefix_str[0];
-
- if (s[0] != 0)
- {
- text = callbacks->GetWindowContents(w);
-
- callbacks->StartProgress("\pChanging Lines…", end_line - start_line, FALSE);
- old_start = start_line;
-
- if (prefix_info.line_start)
- {
- if (prefix_info.insert)
- {
- for ( ; start_line < end_line; start_line++) {
- callbacks->DoProgress(start_line - old_start);
-
- sel_start = callbacks->GetLinePos(start_line);
- callbacks->SetSelection(sel_start, sel_start, first_char);
- callbacks->Insert((char *)&s[1], s[0]);
- };
- }
- else
- {
- for ( ; start_line < end_line; start_line++) {
- callbacks->DoProgress(start_line - old_start);
-
- sel_start = callbacks->GetLinePos(start_line);
-
- if (callbacks->FindPattern(*text, sel_start + s[0] + 1, sel_start,
- &s[1], s[0], FALSE) >= 0)
- {
- callbacks->SetSelection(sel_start, sel_start + s[0], first_char);
- callbacks->Delete();
- }
- };
- }
- }
- else
- {
- if (prefix_info.insert)
- {
- for ( ; start_line < end_line; start_line++) {
- callbacks->DoProgress(start_line - old_start);
-
- sel_start = callbacks->GetLinePos(start_line);
- sel_start = callbacks->GetLineEnd(sel_start);
-
- callbacks->SetSelection(sel_start, sel_start, first_char);
- callbacks->Insert((char *)&s[1], s[0]);
- };
- }
- else
- {
- for ( ; start_line < end_line; start_line++) {
- callbacks->DoProgress(start_line - old_start);
-
- sel_start = callbacks->GetLinePos(start_line);
- sel_end = callbacks->GetLineEnd(sel_start);
-
- if (callbacks->FindPattern(*text, sel_end, sel_end - s[0],
- &s[1], s[0], FALSE))
- {
- callbacks->SetSelection(sel_end - s[0], sel_end, first_char);
- callbacks->Delete();
- }
- };
- }
- }
-
- callbacks->DoneProgress();
- }
- };
-
- RestoreA4();
- }
-